#include <vector>

using namespace std;

class Solution
{
public:
    // 思路：  使用矩阵的第一行和第一列作为标记，标记该行或该列是否需要置为0。同时使用一个额外的变量标记第一行是否需要置为0，以避免与第一列的标记冲突。最后根据标记将相应的行和列置为0。
    void setZeroes(vector<vector<int>> &matrix)
    {
        int rows = matrix.size();      // 行数
        int cols = matrix[0].size();   //     列数
        int zeroRow = 1;               // 标记第0行是否需要置0
        for (int i = 0; i < rows; ++i) //   遍历矩阵
        {
            for (int j = 0; j < cols; ++j) //  遍历矩阵
            {
                if (matrix[i][j] == 0) //   遇到0
                {
                    matrix[0][j] = 0; // 标记该列需要置0
                    if (i > 0)        // 不是第0行
                    {
                        matrix[i][0] = 0; // 标记该行需要置0
                    }
                    else
                    {
                        zeroRow = 0; // 第0行需要置0
                    }
                }
            }
        }
        // 根据标记置0
        for (int i = 1; i < rows; ++i)
        {
            for (int j = 1; j < cols; ++j)
            {
                if (matrix[i][0] == 0 || matrix[0][j] == 0)
                {
                    matrix[i][j] = 0;
                }
            }
        }
        // 判断第0列要为0不  为什么要先判断第0列，因为如果先判断第0行，那么第0行的第0个元素可能已经被置为0了，导致无法正确判断第0列是否需要置为0
        if (matrix[0][0] == 0)
        {
            for (int i = 1; i < rows; i++)
            {
                matrix[i][0] = 0;
            }
        }
        // 判断第0行要为0不
        if (zeroRow == 0)
        {
            for (int i = 0; i < cols; i++)
            {
                matrix[0][i] = 0;
            }
        }
    }
};